/******************************************************************************
* Name         : img_types.h
* Title        : Global types for use by IMG APIs
* Author(s)    : Imagination Technologies
* Created      : 1st August 2003
*
* Copyright    : 2003 by Imagination Technologies Limited.
*                All rights reserved.  No part of this software, either
*                material or conceptual may be copied or distributed,
*                transmitted, transcribed, stored in a retrieval system 
*                or translated into any human or computer language in any
*                form by any means, electronic, mechanical, manual or
*                other-wise, or disclosed to third parties without the
*                express written permission of Imagination Technologies
*                Limited, Unit 8, HomePark Industrial Estate, 
*                King's Langley, Hertfordshire, WD4 8LZ, U.K.
*
* Description  : Defines type aliases for use by IMG APIs
*
* Platform     : Generic
*
* Modifications:-
* $Log: img_types.h,v $
*
*  --- Revision Logs Removed --- 
*
*  --- Revision Logs Removed --- 
*
*  --- Revision Logs Removed --- 
*
*  --- Revision Logs Removed --- 
*
*  --- Revision Logs Removed --- 
*
*  --- Revision Logs Removed --- 
*
*  --- Revision Logs Removed --- 
*
*
******************************************************************************/

#if !defined(__IMG_TYPES_H__)
#define __IMG_TYPES_H__

typedef unsigned int	IMG_UINT,	*IMG_PUINT;
typedef signed int		IMG_INT,	*IMG_PINT;

typedef unsigned char	IMG_UINT8,	*IMG_PUINT8;
typedef unsigned char	IMG_BYTE,	*IMG_PBYTE;
typedef signed char		IMG_INT8,	*IMG_PINT8;
typedef char			IMG_CHAR,	*IMG_PCHAR;

typedef unsigned short	IMG_UINT16,	*IMG_PUINT16;
typedef signed short	IMG_INT16,	*IMG_PINT16;

typedef unsigned long	IMG_UINT32,	*IMG_PUINT32;
typedef signed long		IMG_INT32,	*IMG_PINT32;

typedef void**			IMG_HVOID,	* IMG_PHVOID;

#ifndef __KERNEL__
/* Linux kernel mode does not use floating point */
typedef float			IMG_FLOAT,	*IMG_PFLOAT;
#endif

typedef	enum tag_img_bool
{
	IMG_FALSE		= 0,
	IMG_TRUE		= 1,
	IMG_FORCE_ALIGN = 0x7FFFFFFF
} IMG_BOOL, *IMG_PBOOL;

typedef void			IMG_VOID,	*IMG_PVOID;

typedef IMG_INT32		IMG_RESULT;

typedef IMG_UINT32      IMG_UINTPTR_T;

typedef IMG_PVOID       IMG_HANDLE;

typedef IMG_UINT32      IMG_SIZE_T;

#define IMG_NULL		0


/*
 * Address types.
 * All types used to refer to a block of memory are wrapped in structures
 * to enforce some type degree of type safety. i.e. a IMG_DEV_VIRTADDR cannot
 * be assigned to a variable of type IMG_DEV_PHYSADDR because they are not the
 * same thing.
 *
 * There is an assumption that the system contains at most one non-cpu mmu,
 * and a memory block is only mapped by the MMU once.
 *
 * Different devices could have offset views of the physical address space.
 * 
 */


/*
 *
 * +------------+    +------------+      +------------+        +------------+
 * |    CPU     |    |    DEV     |      |    DEV     |        |    DEV     |
 * +------------+    +------------+      +------------+        +------------+
 *       |                 |                   |                     |
 *       | PVOID           |IMG_DEV_VIRTADDR   |IMG_DEV_VIRTADDR     |
 *       |                 \-------------------/                     |
 *       |                          |                                |
 * +------------+             +------------+                         |     
 * |    MMU     |             |    MMU     |                         |
 * +------------+             +------------+                         | 
 *       |                          |                                | 
 *       |                          |                                |
 *       |                          |                                |
 *   +--------+                +---------+                      +--------+
 *   | Offset |                | (Offset)|                      | Offset |
 *   +--------+                +---------+                      +--------+    
 *       |                          |                IMG_DEV_PHYADDR | 
 *       |                          |                                |
 *       |                          | IMG_DEV_PHYADDR                |
 * +---------------------------------------------------------------------+ 
 * |                         System Address bus                          |
 * +---------------------------------------------------------------------+
 *
 */

typedef IMG_PVOID IMG_CPU_VIRTADDR;

/* cpu physical address */
typedef struct {IMG_UINT32 uiAddr;} IMG_CPU_PHYADDR;

/* device virtual address */
typedef struct {IMG_UINT32 uiAddr;} IMG_DEV_VIRTADDR;

/* device physical address */
typedef struct {IMG_UINT32 uiAddr;} IMG_DEV_PHYADDR;

/* system physical address */
typedef struct {IMG_UINT32 uiAddr;} IMG_SYS_PHYADDR;

/* 
	system physical structure.
	specifies contiguous and non-contiguous system physical addresses
*/
typedef struct _SYSTEM_ADDR_
{
	/* if zero this is contiguous */
	IMG_UINT32	ui32PageCount;
	union
	{
		/*	
			contiguous address: 
			basic system address  
		*/
		IMG_SYS_PHYADDR	sContig;		

		/* 
			non-contiguous address:
			multiple system page addresses representing system pages 
			of which a single allocation is composed
			Note: if non-contiguous allocation don't always start at a page boundary
			then a page offset word is also required
		*/
		IMG_SYS_PHYADDR	asNonContig[1];
	} u;
} SYSTEM_ADDR;

#endif	/* __IMG_TYPES_H__ */
/*****************************************************************************
 End of file (img_types.h)
*****************************************************************************/
